import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';

let initState = {
    loaded:false, // 数据是否加载
    list: {}, //所有数据
    category: [], // 产品分类
    list_cate: [], // 当前分类下的数据列表
    cart_list: [], //购物车
    totalNum: 0, //购物车上的数量
}

let totalNum = (cart_list) => {
    let total = 0;
    cart_list.forEach((item) => {
        total += item.cartnum;
    })

    return total;
}

let removeNum=(list,item)=>{
    let index =list.findIndex((ite)=>ite.key+''===item.key+'');
    if(index>=0){
        list[index].cartnum--;
    }
  
    return list
}

let addNum=(list,item)=>{
    let index =list.findIndex((ite)=>ite.key+''===item.key+'');
    list[index].cartnum++;
    return list
}


let reducer = (state = initState, actions) => {
    switch (actions.type) {
        case "SET_LIST":
            state.list = actions.data; // 设置list
            state.loaded=true; // 更新加载状态
            state.category = Object.keys(actions.data); // 初始化分类
            state.list_cate = actions.data[Object.keys(actions.data)[0]]; // 获取到第一个分类下的列表
            break;

        case "SELECT_CATEGORY": // 选中分类
            state.list_cate = state.list[actions.data];
            break;

        case "ADD_CART":  // 从产品列表添加到购物车
            state.list_cate=addNum(state.list_cate,actions.data); // 更新当前分类下的数据列表list_cate中 该产品的cartnum值 +1
            state.list[actions.data.cate]=addNum( state.list[actions.data.cate],actions.data) ;  //更新产品列表list上的 该产品cartnum值 +1
          
            // 查询购物车列表是否已经包含了该产品
            let index_add = state.cart_list.findIndex((item) => actions.data.key + '' === item.key + '');
            
            
            if (index_add === -1) {
                // 没有包含该产品 ，将该产品添加到购物车
                state.cart_list.push(actions.data)
            } else {
                // 已经包含该产品， 把产品的cartnum加1
                state.cart_list[index_add].cartnum++;
            }
            state.totalNum = totalNum(state.cart_list);// 重新计算购物车上的数量
            break;

        case "REMOVE_CART":  // 从产品列表 减少购物车
            state.list_cate=removeNum(state.list_cate,actions.data); //  更新当前分类下的数据列表list_cate中 该产品的cartnum值 -1
            state.list[actions.data.cate]=removeNum( state.list[actions.data.cate],actions.data) ;  //更新产品列表list上的 该产品cartnum值 -1
            
            //查询此产品在购物车列表中的位置
            let index_remove = state.cart_list.findIndex((item) => actions.data.key + '' === item.key + '');
         
            // 如果找到购物车上的位置  就对购物车做操作
            if (index_remove >= 0) {

                // 如果产品原先的购物车数量是1 ，就从购物车中移除该产品
                if (actions.data.cartnum === 1) {
                    state.cart_list.splice(index_remove, 1)
                } else {
                    // 该产品原先的数量>1 就把该购物车上的数量减一
                    state.cart_list[index_remove].cartnum--;
                }
            }else{
                // 没找到购物车上的位置 ，说明此产品没有在购物车里
                // 不用对购物车做任何操作
            }

           
            state.totalNum = totalNum(state.cart_list);// 重新计算购物车上的数量
            break;
        
        
        default:
    }

    return JSON.parse(JSON.stringify(state));
}

export default createStore(reducer, applyMiddleware(thunk));